package veterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import veterinaria.excepcion.DAOExcepcion;
import veterinaria.modelo.Persona;
import veterinaria.modelo.Cliente;
import veterinaria.modelo.Especie;
import veterinaria.modelo.Raza;
import veterinaria.modelo.Paciente;
import veterinaria.util.ConexionBD;

public class PacienteDAO extends BaseDAO {

    public Collection<Paciente> buscarPorNombre(String pNom) throws DAOExcepcion {
        String sqlDoc="Select PacNombre,PacGenero,PacTSangre,PacEsterelizado,PacTamano,PacActividad,PacPeso,PacFNacimiento,PacNotas,PacCondicion,PacImagen,MEspecie_EspCodigo,MRaza_RazCodigo,MCliente_CliCodigo From MPaciente Where NomPaciente Like ?";
        Collection<Paciente> lisDoc=new ArrayList<Paciente>();
        Connection conDoc=null;
        PreparedStatement comDoc=null;
        ResultSet rstDoc=null;
        try {
            conDoc=ConexionBD.obtenerConexion();
            comDoc=conDoc.prepareStatement(sqlDoc);
            comDoc.setString(1, "%" + pNom + "%");
            rstDoc=comDoc.executeQuery();
            while (rstDoc.next()) {
                Paciente regDoc = new Paciente();
                regDoc.setPacCodigo(rstDoc.getInt("PacCodigo"));
                regDoc.setPacGenero(rstDoc.getString("PacNombre"));
                lisDoc.add(regDoc);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
            
        } finally {
            this.cerrarResultSet(rstDoc);
            this.cerrarStatement(comDoc);
            this.cerrarConexion(conDoc);
        }
        System.out.println(lisDoc.size());
        return lisDoc;
    }

    public Paciente insertar(Paciente pReg) throws DAOExcepcion {
        String cSql = "Insert Into MPaciente(PacNombre,PacGenero,PacTSangre,PacEsterilizado,PacTamano,PacActividad,PacPeso,PacFNacimiento,PacNotas,PacCondicion,PacImagen,MEspecie_EspCodigo,MRaza_RazCodigo,MCliente_CliCodigo) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        Connection cCon = null;
        PreparedStatement cCom = null;
        ResultSet cRst = null;
        try {
            cCon = ConexionBD.obtenerConexion();
            cCom = cCon.prepareStatement(cSql);
            cCom.setString(1, pReg.getPacNombre());
            cCom.setString(2, pReg.getPacGenero());
            cCom.setString(3, pReg.getPacTSangre());
            cCom.setString(4, pReg.getPacEsterilizado());
            cCom.setString(5, pReg.getPacTamano());
            cCom.setString(6, pReg.getPacActividad());
            cCom.setDouble(7, pReg.getPacPeso());
            cCom.setString(8, pReg.getPacFNacimiento());
            cCom.setString(9, pReg.getPacNotas());
            cCom.setString(10, pReg.getPacCondicion());
            cCom.setString(11, pReg.getPacImagen());            
            cCom.setInt(12, pReg.getEspecie().getEspCodigo());           
            cCom.setInt(13, pReg.getRaza().getRazCodigo());           
            cCom.setInt(14, pReg.getCliente().getCliCodigo());           
            int nroErr = cCom.executeUpdate();
            if (nroErr != 1) {
                throw new SQLException("No se pudo insertar");
            }
            int newCod = 0;
            cSql="Select Last_Insert_id()";
            cCom=cCon.prepareStatement(cSql);
            cRst=cCom.executeQuery();
            if (cRst.next()) {
                newCod=cRst.getInt(1);
            }
            pReg.setPacCodigo(newCod);
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return pReg;
    }

    public Paciente obtener(int pCod) throws DAOExcepcion {
        Paciente cReg = new Paciente();
        Connection cCon = null;
        PreparedStatement cCom = null;
        ResultSet cRst = null;
        try {
            String query = "Select PacCodigo,PacNombre,PacGenero,PacTSangre,PacEsterilizado,PacTamano,PacActividad,PacPeso,PacFNacimiento,PacNotas,PacCondicion,PacImagen,MEspecie_EspCodigo,MRaza_RazCodigo,MCliente_CliCodigo From MPaciente Where PacCodigo=?";
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(query);
            cCom.setInt(1, pCod);
            cRst=cCom.executeQuery();
            if (cRst.next()) {
                cReg.setPacCodigo(cRst.getInt(1));
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return cReg;
    }

    public void eliminar(int pCod) throws DAOExcepcion {
        String cSql="Delete From MPaciente Where PacCodigo=?";
        Connection cCon=null;
        PreparedStatement cCom=null;
        try {
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(cSql);
            cCom.setInt(1, pCod);
            int i = cCom.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo eliminar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
    }

	public Paciente actualizar(Paciente pReg) throws DAOExcepcion {
		String cSql="UpDate MPaciente Set PacNombre=?,PacGenero=?,PacTSangre=?,PacEsterilizado=?,PacTamano=?,PacActividad=?,PacPeso=?,PacFNacimiento=?,PacNotas=?,PacCondicion=?,PacImagen=?,PacFlg=?,MEspecie_EspCodigo=?,MRaza_RazCodigo=?,MCliente_CliCodigo=? Where PacCodigo=? And PacFlg<>'E'";
		Connection cCon=null;
		PreparedStatement cCom=null;
		try {
			cCon=ConexionBD.obtenerConexion();
			cCom=cCon.prepareStatement(cSql);
            cCom.setString(1, pReg.getPacNombre());
            cCom.setString(2, pReg.getPacGenero());
            cCom.setString(3, pReg.getPacTSangre());
            cCom.setString(4, pReg.getPacEsterilizado());
            cCom.setString(5, pReg.getPacTamano());
            cCom.setString(6, pReg.getPacActividad());
            cCom.setDouble(7, pReg.getPacPeso());
            cCom.setString(8, pReg.getPacFNacimiento());
            cCom.setString(9, pReg.getPacNotas());
            cCom.setString(10, pReg.getPacCondicion());
            cCom.setString(11, pReg.getPacImagen());
            cCom.setString(12, "M");
            cCom.setInt(13, pReg.getEspecie().getEspCodigo());
            cCom.setInt(14, pReg.getRaza().getRazCodigo());
            cCom.setInt(15, pReg.getCliente().getCliCodigo());            
			cCom.setInt(16, pReg.getPacCodigo());			
			int i = cCom.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(cCom);
			this.cerrarConexion(cCon);
		}
		return pReg;
	}
	
    public Collection<Paciente> listar() throws DAOExcepcion {
        Collection<Paciente> c = new ArrayList<Paciente>();
        Connection cCon=null;
        PreparedStatement cCom=null;
        ResultSet cRst=null;
        try {
            cCon = ConexionBD.obtenerConexion();
            String cSql="Select a.PacCodigo,a.PacNombre,a.PacGenero,a.PacTSangre,a.PacEsterilizado,a.PacTamano,a.PacActividad,a.PacPeso,a.PacFNacimiento,a.PacNotas,a.PacCondicion,a.PacImagen,a.MEspecie_EspCodigo,a.MRaza_RazCodigo,a.MCliente_CliCodigo,b.EspNombre,c.RazNombre,d.CliEstado,d.CliRuc,d.MPersona_PerCodigo,e.PerNombre,e.PerDomicilio,e.PerTelefono,e.PerCelular,e.PerImagen From MPaciente a, MEspecie b, MRaza c, MCliente d, MPersona e Where a.MEspecie_EspCodigo=b.EspCodigo And a.MRaza_RazCodigo=c.RazCodigo And a.MCliente_CliCodigo=d.CliCodigo And d.MPersona_PerCodigo=e.PerCodigo";
            cCom=cCon.prepareStatement(cSql);
            cRst=cCom.executeQuery();
            while (cRst.next()) {
                Paciente cPac = new Paciente();
                Especie cEsp=new Especie();
                Raza cRaz=new Raza();
                Cliente cCli=new Cliente();
                Persona cPer=new Persona();
                cEsp.setEspCodigo(cRst.getInt("MEspecie_EspCodigo"));
                cEsp.setEspNombre(cRst.getString("EspNombre"));                
                cRaz.setRazCodigo(cRst.getInt("MRaza_RazCodigo"));
                cRaz.setRazNombre(cRst.getString("RazNombre"));
                cCli.setCliCodigo(cRst.getInt("MCliente_CliCodigo"));    
                cCli.setCliEstado(cRst.getString("Cliestado"));    
                cCli.setCliRuc(cRst.getString("CliRuc"));
                cPer.setPerCodigo(cRst.getInt("MPersona_PerCodigo"));
                cPer.setPerNombre(cRst.getString("PerNombre"));
                cPer.setPerDomicilio(cRst.getString("PerDomicilio"));
                cPer.setPerTelefono(cRst.getString("PerTelefono"));
                cPer.setPerCelular(cRst.getString("PerCelular"));
                cPer.setPerImagen(cRst.getString("PerImagen"));                
                cPac.setPacCodigo(cRst.getInt("PacCodigo"));
                cPac.setPacNombre(cRst.getString("PacNombre"));
                cPac.setPacGenero(cRst.getString("PacGenero"));
                cPac.setPacTSangre(cRst.getString("PacTSangre"));                
                cPac.setPacEsterilizado(cRst.getString("PacEsterilizado"));
                cPac.setPacTamano(cRst.getString("PacTamano"));
                cPac.setPacActividad(cRst.getString("PacActividad"));
                cPac.setPacPeso(cRst.getDouble("PacPeso"));
                cPac.setPacFNacimiento(cRst.getString("PacFNacimiento"));
                cPac.setPacCondicion(cRst.getString("PacCondicion"));
                cPac.setPacImagen(cRst.getString("PacImagen"));                
                cCli.setPersona(cPer);
                cPac.setEspecie(cEsp);
                cPac.setRaza(cRaz);
                cPac.setCliente(cCli);
                c.add(cPac);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return c;
    }    
}
